
#ifndef DIRVER_CAN_H
#define DIRVER_CAN_H

#include "main.h"

#define CHASSIS_CAN hcan1 // CAN串口1
#define GIMBAL_CAN hcan2  // CAN串口2

/* CAN send and receive ID */
// CAN 发送和接收结构体 ID
typedef enum {
  CAN_CHASSIS_ALL_ID = 0x200,
  CAN_3508_M1_ID = 0x201,
  CAN_3508_M2_ID = 0x202,
  CAN_3508_M3_ID = 0x203,
  CAN_3508_M4_ID = 0x204,

  CAN_YAW_MOTOR_ID = 0x205,
  CAN_PIT_MOTOR_ID = 0x206,
  CAN_TRIGGER_MOTOR_ID = 0x207,
  CAN_GIMBAL_ALL_ID = 0x1FF,

} can_msg_id_e;

// 电机数据结构体
typedef struct {
  uint16_t ecd;
  int16_t speed_rpm;
  int16_t given_current;
  uint8_t temperate;
  int16_t last_ecd;
  int16_t angle;
} motor_measure_t;
extern uint32_t ConnectFlag;
extern uint32_t Pre_ConnectFlag;

/**
 * @brief          发送电机控制电流(0x201,0x202,0x203,0x204)
 * @param[in]      motor1: (0x201) 3508电机控制电流, 范围 [-16384,16384]
 * @param[in]      motor2: (0x202) 3508电机控制电流, 范围 [-16384,16384]
 * @param[in]      motor3: (0x203) 3508电机控制电流, 范围 [-16384,16384]
 * @param[in]      motor4: (0x204) 3508电机控制电流, 范围 [-16384,16384]
 * @retval         none
 */
extern void CAN_cmd_chassis(int16_t motor1, int16_t motor2, int16_t motor3,
                            int16_t motor4);
///**
// * @brief          发送电机控制电流(0x205,0x206,0x207,0x208)
// * @param[in]      yaw:    (0x205) 6020电机控制电流, 范围 [-30000,30000]
// * @param[in]      pitch:  (0x206) 6020电机控制电流, 范围 [-30000,30000]
// * @param[in]      shoot:  (0x207) 2006电机控制电流, 范围 [-10000,10000]
// * @param[in]      rev:    (0x208) 保留，电机控制电流
// * @retval         none
// */
// extern void CAN_cmd_gimbal(int16_t yaw, int16_t pitch, int16_t shoot,
//                           int16_t rev);
//
///**
// * @brief          发送ID为0x700的CAN包,它会设置3508电机进入快速设置ID
// * @param[in]      none
// * @retval         none
// */
// extern void CAN_cmd_chassis_reset_ID(void);

/**
 * @brief          返回底盘电机 3508电机数据指针
 * @param[in]      i: 电机编号,范围[0,3]
 * @retval         电机数据指针
 */
extern const motor_measure_t *get_chassis_motor_measure_point(uint8_t i);

///**
// * @brief          返回拨弹电机 2006电机数据指针
// * @param[in]      none
// * @retval         电机数据指针
// */
// extern const motor_measure_t *get_trigger_motor_measure_point(void);
//
///**
// * @brief          返回yaw 6020电机数据指针
// * @param[in]      none
// * @retval         电机数据指针
// */
// extern const motor_measure_t *get_yaw_gimbal_motor_measure_point(void);
//
///**
// * @brief          返回pitch 6020电机数据指针
// * @param[in]      none
// * @retval         电机数据指针
// */
// extern const motor_measure_t *get_pitch_gimbal_motor_measure_point(void);

void CAN_Init(CAN_HandleTypeDef *hcan);
void can_filter_init(void);
#endif
